// setops.cpp -- some set operations
//#include <iostream>
//#include <string>
//#include <set>
//#include <algorithm>
//#include <iterator>
//
//int main()
//{
//	using namespace std;
//	const int N = 6;
//	string s1[N] = { "buffoon", "thinkers", "for", "heavy", "can", "for" };
//	string s2[N] = { "metal", "any", "food", "elegant", "deliver", "for" };
//
//	set<string> A(s1, s1 + N);
//	set<string> B(s2, s2 + N);
//
//	ostream_iterator<string, char> out(cout, " ");
//	cout << "Set A: ";
//	copy(A.begin(), A.end(), out);
//	cout << endl;
//
//	cout << "Set B: ";
//	copy(B.begin(), B.end(), out);
//	cout << endl;
//
//	cout << "Union of A and B:\n";
//	set_union(A.begin(), A.end(), B.begin(), B.end(), out);
//	cout << endl;
//
//	cout << "Intersection of A and B:\n";
//	set_intersection(A.begin(), A.end(), B.begin(), B.end(), out);
//	cout << endl;
//
//	cout << "Difference of A and B:\n";
//	set_difference(A.begin(), A.end(), B.begin(), B.end(), out);
//	cout << endl;
//
//	set<string> C;
//	cout << "Set C:\n";
//	set_union(A.begin(), A.end(), B.begin(), B.end(),
//		insert_iterator<set<string> >(C, C.begin()));
//	copy(C.begin(), C.end(), out);
//	cout << endl;
//
//	string s3("grungy");
//	C.insert(s3);
//	cout << "Set C after insertion:\n";
//	copy(C.begin(), C.end(), out);
//	cout << endl;
//
//	cout << "Showing a range:\n";
//	copy(C.lower_bound("ghost"), C.upper_bound("spook"), out);
//	cout << endl;
//
//	return 0;
//}

// multmap.cpp -- use a multimap
//#include <iostream>
//#include <string>
//#include <map>
//#include <algorithm>
//
//typedef int KeyType;
//typedef std::pair<const KeyType, std::string> Pair;
//typedef std::multimap<KeyType, std::string> MapCode;
//
//int main()
//{
//	using namespace std;
//	MapCode codes;
//
//	codes.insert(Pair(415, "San Francisco"));
//	codes.insert(Pair(510, "Oakland"));
//	codes.insert(Pair(718, "Brooklyn"));
//	codes.insert(Pair(718, "Staten Island"));
//	codes.insert(Pair(415, "San Rafael"));
//	codes.insert(Pair(510, "Berkeley"));
//
//	cout << "Number of cities with area code 415: "
//		<< codes.count(415) << endl;
//	cout << "Number of cities with area code 718: "
//		<< codes.count(718) << endl;
//	cout << "Number of cities with area code 510: "
//		<< codes.count(510) << endl;
//	cout << "Area Code  City\n";
//	MapCode::iterator it;
//	for (it = codes.begin(); it != codes.end(); ++it)
//	{
//		cout << "   " << (*it).first << "   "
//			<< (*it).second << endl;
//	}
//
//	pair<MapCode::iterator, MapCode::iterator> range
//		= codes.equal_range(718);
//	cout << "Cities with area code 718:\n";
//	for (it = range.first; it != range.second; ++it)
//	{
//		cout << (*it).second << endl;
//	}
//
//	return 0;
//}

// functor.cpp -- using a functor
//#include <iostream>
//#include <list>
//#include <iterator>
//#include <algorithm>
//
//template<class T>	// functor class defines operator()()
//class TooBig
//{
//private:
//	T cutoff;
//public:
//	TooBig(const T& t) :cutoff(t) {}
//	bool operator()(const T& v) { return v > cutoff; }
//};
//
//void outint(int n) { std::cout << n << " "; }
//
//int main()
//{
//	using std::list;
//	using std::cout;
//	using std::endl;
//
//	TooBig<int> f100(100);	// limit = 100
//	int vals[10] = { 50, 100, 90, 180, 60, 210, 415, 88, 188, 201 };
//	list<int> yadayada(vals, vals + 10);	// range constructor
//	list<int> etcetera(vals, vals + 10);
//// C++11 can use the following instead
////	list<int> yadayada = { 50, 100, 90, 180, 60, 210, 415, 88, 188, 201 };
////	list<int> etcetera = { 50, 100, 90, 180, 60, 210, 415, 88, 188, 201 };
//	cout << "Original lists:\n";
//	for_each(yadayada.begin(), yadayada.end(), outint);
//	cout << endl;
//	for_each(etcetera.begin(), etcetera.end(), outint);
//	cout << endl;
//
//	yadayada.remove_if(f100);				// use a named function object
//	etcetera.remove_if(TooBig<int>(200));	// construct a function object
//	cout << "Trimmed lists:\n";
//	for_each(yadayada.begin(), yadayada.end(), outint);
//	cout << endl;
//	for_each(etcetera.begin(), etcetera.end(), outint);
//	cout << endl;
//	
//	return 0;
//}

// funadap.cpp -- using function adapters
//#include <iostream>
//#include <vector>
//#include <iterator>
//#include <algorithm>
//#include <functional>
//
//void Show(double);
//const int LIM = 6;
//
//int main()
//{
//	using namespace std;
//	double arr1[LIM] = { 28, 29, 30, 35, 38, 59 };
//	double arr2[LIM] = { 63, 65, 69, 75, 80, 99 };
//	vector<double> gr8(arr1, arr1 + LIM);
//	vector<double> m8(arr2, arr2 + LIM);
//	cout.setf(ios_base::fixed);
//	cout.precision(1);
//	cout << "gr8:\t";
//	for_each(gr8.begin(), gr8.end(), Show);
//	cout << endl;
//	cout << "m8 :\t";
//	for_each(m8.begin(), m8.end(), Show);
//	cout << endl;
//
//	vector<double> sum(LIM);
//	transform(gr8.begin(), gr8.end(), m8.begin(), sum.begin(),
//			  plus<double>());
//	cout << "sum:\t";
//	for_each(sum.begin(), sum.end(), Show);
//	cout << endl;
//
//	vector<double> prod(LIM);
//	transform(gr8.begin(), gr8.end(), prod.begin(),
//			  bind1st(multiplies<double>(), 2.5));
//	cout << "prod:\t";
//	for_each(prod.begin(), prod.end(), Show);
//	cout << endl;
//
//	return 0;
//}
//
//void Show(double v)
//{
//	std::cout.width(6);
//	std::cout << v << ' ';
//}

// usealgo.cpp -- using several STL elements
//#include <iostream>
//#include <string>
//#include <vector>
//#include <set>
//#include <map>
//#include <iterator>
//#include <algorithm>
//#include <cctype>
//using namespace std;
//
//char toLower(char ch) { return tolower(ch); }
//string& ToLower(string& st);
//void display(const string& s);
//
//int main()
//{
//	vector<string> words;
//	cout << "Enter words (enter quit to quit):\n";
//	string input;
//	while (cin >> input && input != "quit")
//	{
//		words.push_back(input);
//	}
//
//	cout << "You entered the following words:\n";
//	for_each(words.begin(), words.end(), display);
//	cout << endl;
//
//	// place words in set, converting to lowercase
//	set<string> wordset;
//	transform(words.begin(), words.end(),
//		insert_iterator<set<string> >(wordset, wordset.begin()),
//		ToLower);
//	cout << "\nAlphabetic list of words:\n";
//	for_each(wordset.begin(), wordset.end(), display);
//	cout << endl;
//
//	// place word and frequency in map
//	map<string, int> wordmap;
//	set<string>::iterator si;
//	for (si = wordset.begin(); si != wordset.end(); si++)
//	{
//		wordmap[*si] = count(words.begin(), words.end(), *si);
//	}
//
//	// display map contents
//	cout << "\nWord frequency:\n";
//	for (si = wordset.begin(); si != wordset.end(); si++)
//	{
//		cout << *si << ": " << wordmap[*si] << endl;
//	}
//
//	return 0;
//}
//
//string& ToLower(string& st)
//{
//	transform(st.begin(), st.end(), st.begin(), toLower);
//	return st;
//}
//
//void display(const string& s)
//{
//	cout << s << " ";
//}

// ilist.cpp -- use initializer_list (C++11 feature)
//#include <iostream>
//#include <initializer_list>
//
//double sum(std::initializer_list<double> il);
//double average(const std::initializer_list<double>& ril);
//
//int main()
//{
//	using std::cout;
//
//	cout << "List 1: sum = " << sum({ 2, 3, 4 })
//		 << ", ave = " << average({ 2, 3, 4 }) << '\n';
//	std::initializer_list<double> dl = { 1.1, 2.2, 3.3, 4.4, 5.5 };
//	cout << "List 2: sum = " << sum(dl)
//		 << ", ave = " << average(dl) << '\n';
//	dl = { 16.0, 25.0, 36.0, 40.0, 64.0 };
//	cout << "List 3: sum = " << sum(dl)
//		 << ", ave = " << average(dl) << '\n';
//
//	return 0;
//}
//
//double sum(std::initializer_list<double> il)
//{
//	double tot = 0;
//	for (auto p = il.begin(); p != il.end(); p++)
//	{
//		tot += *p;
//	}
//	return tot;
//}
//
//double average(const std::initializer_list<double>& ril)
//{
//	double tot = 0;
//	int n = ril.size();
//	double ave = 0.0;
//	if (n > 0)
//	{
//		for (auto p = ril.begin(); p != ril.end(); p++)
//		{
//			tot += *p;
//		}
//		ave = tot / n;
//	}
//
//	return ave;
//}

// defaults.cpp -- cout default formats
//#include <iostream>
//
//int main()
//{
//	using std::cout;
//	
//	cout << "12345678901234567890\n";
//	char ch = 'K';
//	int t = 273;
//	cout << ch << ":\n";
//	cout << t << ":\n";
//	cout << -t << ":\n";
//
//	double f1 = 1.200;
//	cout << f1 << ":\n";
//	cout << (f1 + 1.0 / 9.0) << ":\n";
//
//	double f2 = 1.67E2;
//	cout << f2 << ":\n";
//	f2 += 1.0 / 9.0;
//	cout << f2 << ":\n";
//	cout << (f2 * 1.0e4) << ":\n";
//
//	double f3 = 2.3e-4;
//	cout << f3 << ":\n";
//	cout << f3 / 10 << ":\n";
//
//	return 0;
//}

// cinexcp.cpp -- having cin throw an exception
//#include <iostream>
//#include <exception>
//
//int main()
//{
//	using namespace std;
//	// have failbit cause an exception to be thrown
//	cin.exceptions(ios_base::failbit);
//	cout << "Enter number: ";
//	int sum = 0;
//	int input;
//	try
//	{
//		while (cin >> input)
//		{
//			sum += input;
//		}
//	}
//	catch (ios_base::failure& bf)
//	{
//		cout << bf.what() << endl;
//		cout << "O! the horror!\n";
//	}
//
//	cout << "Last value entered = " << input << endl;
//	cout << "Sum = " << sum << endl;
//
//	return 0;
//}